使用bind搭建DNS服务器

1. DNS介绍

DNS为Domain Name System(域名系统)的缩写,它是一种将IP地址转换成对应的主机名或将主机名转换成与之对应的IP地址的服务机制。其中通过域名解析出IP地址的叫做正向解析,通过IP地址解析出域名的叫做反向解析。DNS使用TCP和UDP,端口号都是53,但它主要使用UDP,服务器中间备份使用TCP。全世界只有13台“根”服务器,1个主根服务器放在美国,其它12太为辅根服务器。

DNS服务器根据角色可以分为:

  • 主DNS
  • 从DNS
  • DNS缓存服务器
  • DNS转发服务器

当有了网站域名,那是如何解析到IP的呢?下面为域名解析的过程:

  • 在浏览器中输入www.lishiming.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址的映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
  • 如果hosts文件里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
  • 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找本机设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则反回解析结果给客户机,完成域名解析,词解析具有权威性。
  • 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已经缓存了此网址的映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
  • 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发)进行查询,如果未用转发模式,本地DNS就把请求发送至13台根DNS,根DNS服务器收到请求后会判断这个域名(.net)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会练习负责.net域的这台服务器。这台负责.net域的服务器收到请求后,如果自己无法解析,它就会找一个管理.net域的下一级DNS服务器(lishiming.net)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找lishiming.net域服务器,重复上面的动作,进行查询,直至找到www.lishiming.net主机。
  • 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把请求专职上上级DNS服务器,以此循环。不管是本地DNS服务器用的是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

2. bind安装配置

2.1. 安装

我们使用bind来搭建DNS服务。首先安装bind

1
2
# yum install -y bind
# cp /etc/named.conf /etc/named.conf.bak

2.2. 配置本地的域

  • 把默认的配置文件清空(改文件是主配置文件),然后我们自定义配置:
    • > /etc/named.conf
    • vim /etc/named.conf
  • 加入如下配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    options {
    directory "/var/named";
    };
    zone "." IN {
    type hint;
    file "named.ca";
    };
    zone "localhost" IN {
    type master;
    file "localhost.zone";
    };
    zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.local";
    };
  • 保存配置后,修改其属主:

    1
    2
    # chown named /etc/named.conf
    # cd /var/named/

接下来:

  • 定义根域配置文件:

    1
    # dig -t NS . > named.ca
  • 然后定义本地域配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # vim localhost.zone
    #<==加入如下内容
    @ IN SOA localhost. admin.localhost. (
    2013081601
    1H
    10M
    7D
    1D
    )
    @ IN NS localhost.
    localhost. IN A 127.0.0.1
  • 再配置反解析配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # vim named.local
    #<==加入如下配置
    $TTL 86400
    @ IN SOA localhost. admin.localhost. (
    2013081601
    iH
    10M
    7D
    1D
    )
    @ IN NS localhost.
    1 IN PTR localhost

进行检测:

  • 检测配置是否有问题:

    1
    # named-checkconf
  • 检测正解析

    1
    # named-checkzone "localhost" /var/named/localhost.zone
  • 检测反解析

    1
    # named-checkzone "0.0.127.in-addr.arpa" /var/named/named.conf
  • 生成rndc.key,如果没有这个key,named是启动不了的。

    1
    2
    # rndc-confgen -r /dev/urandom -a
    # chown named:named /etc/rndc.key
  • 启动named服务:

    1
    # /etc/init.d/named start
  • 查看是否有53端口

    1
    # netstat -lnp | grep named
  • 首先测试正向解析:

    1
    # dig @127.0.0.1 localhost.
  • 接着测试反解析:

    1
    # dig @127.0.0.1 -x 127.0.0.1

2.3. 增加一个域名(zone)

上面的操作仅仅是建立了一个本地的域localhost,还不是我们想要的,下面再增加一个域名(zone):

1
2
3
4
5
6
7
8
9
10
11
12
# vim /etc/named.conf
#<==写入如下内容
zone "abc.com" IN {
type master;
file "abc.com.zone";
};
zone "137.168.192.in-addr.arpa" IN {
type master;
file "192.168.zone";
};

编辑zone文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# vim /var/named/abc.com.zone
#<==写入如下内容
$TTL 600
@ IN SOA abc.com. root.abc.com. (
2013081601
1H
10M
7D
1D
)
IN NS ns.abc.com #<==应该指定本地服务器的IP
IN MX 10 mail.abc.com
ns IN A 192.168.0.11 #<==本地服务器的IP
www IN A 192.168.137.73
mail IN A 192.168.137.10
bbs IN CNAME www.abc.com.

编辑反解析文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# vim /var/named/192.168.zone
#<==写入如下内容
$TTL 600
@ IN SOA ns.abc.com. root.abc.com. (
2013081611H
10M
7D
1D
)
@ IN NS ns.abc.com.
10 IN PTR ns.abc.com.
11 IN PTR mail.abc.com.
73 IN PTR www.abc.com.

分别检测两个配置文件是否有问题:

  • named-checkzone "abc.com" abc.com.zone
  • named-checkzone "137.168.192.in-addr.arpa" 192.168.zone

重启named服务,测试:

  • dig @127.0.0.1 www.abc.com
  • dig @127.0.0.1 -x 192.168.127.11

abc.com的域配置好后,要想使用它必须把系统里面的DNS服务器IP设定为这台机器的IP,但是这样也会带来一个问题,那就是它只能解析abc.com的域名,其它域名不能解析,比如www.lishiming.net它没有办法解析,这时候需要给它配置DNS转发。

2.4. DNS转发配置

1
2
3
4
5
# vim /etc/named.conf
#<==在options{}里面增加
forward first;
forwarders { 8.8.8.8; };

这两行就是用来配置转发的,该DNS服务器不能解析的域名会转发到8.8.8.8这个DNS服务器上去解析。

2.5. DNS主从配置

任何服务都有可能因为某些原因导致不能正常提供服务,所以我们有必要为DNS服务器配置一个备用的,但是这两台服务器需要保证数据的一致性。比如我们更改主上配置把www.abc.com解析IP更改了,那么备用服务器上也得跟着自动变。下面的步骤就是配置主从的。

  • 首先,在从服务器上安装bind:

    1
    # yum install -y bind
  • 然后拷贝主上的配置文件到从上,在这里主服务器的IP为192.168.0.11,从服务器IP为192.168.0.12(注意,下面的操作是在主服务器上)

    1
    2
    3
    # scp /etc/named.conf 192.168.0.12:/etc/
    # scp /var/named/localhost.zone 192.168.0.12:/var/named/
    # scp /var/named/named.local 192.168.0.12:/var/named/
  • 从服务器上,拷贝过来后,修改一下/etc/named.conf,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    options {
    directory "/var/named";
    };
    zone "." IN {
    type hint;
    file "named.ca";
    };
    zone "localhost" IN {
    type master;
    file "localhost.zone";
    };
    zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.local";
    };
    zone "abc.com" IN {
    type slave;
    file "slaves/abc.com.zone";
    masters { 192.168.0.11; };
    };
    zone "137.168.192.in-addr.arpa" IN {
    type slave;
    file "slaves/192.168.zone";
    masters { 192.168.0.11; };
    };
  • 从上生成rndc.key:

    1
    2
    # rndc-confgen -r /dev/urandom -a
    # chown named:named /etc/rndc.key
  • 从上启动named:

    1
    # /etc/init.d/named start
  • 启动成功后会在/var/named/下生成一个slave目录,这个目录下会有192.168.zone和abc.com.cone这两个文件,内容是和主上的一样。

  • 然后在从上测试是否可以解析:
    1
    # dig @127.0.0.1 www.abc.com

下面我们测试主从同步:

  • 在主DNS上更改文件/var/named/abc.com.zone

    1
    2
    3
    #<==在最后增加一行
    123 IN A 1.1.1.1
  • 另外需要修改一下第三行的那个数字串,这个是用来做标记的,只有这个数字变化了,才可以让从自动跟着便,数字只能变大,不能减小,把2013081601改成2013081602

  • 重启主named服务:

    1
    # /etc/init.d/named restart
  • 经测试我们发现一个问题,就是从经常hi同步特别慢,这是很要命的。所以需要我们做一个特殊操作

    • 在主上的/etc/named.conf中,abc.com的zone中增加两行:
      1
      2
      notify yes;
      also-notify { 192.168.0.12; };
0%